package pacs.sgc.negocio;

import java.util.List;

import pacs.sgc.classesbasicas.Cliente;
import pacs.sgc.dao.ClienteDao;
import pacs.sgc.dao.FabricaDao;
import pacs.sgc.exceptions.AcessoAoBancoException;
import pacs.sgc.exceptions.ClienteJaCadastradoException;
import pacs.sgc.exceptions.ClienteNaoEncontradoException;
import pacs.sgc.exceptions.ConexaoComBancoException;
import pacs.sgc.exceptions.NenhumClienteCadastradoException;

public class CadastroCliente implements ICadastroCliente {
	
	ClienteDao clienteDao;
	
	/**
	 * Construtor Default.
	 *
	 */
	public CadastroCliente(){
		this.clienteDao = FabricaDao.criarClienteDao();
	}
	

	public void atualizar(Cliente atualizado) throws ConexaoComBancoException, AcessoAoBancoException, ClienteNaoEncontradoException {
		if(this.clienteDao.localizar(atualizado.getCpf(), null) != null){
			this.clienteDao.atualizar(atualizado);
		}else{
			ClienteNaoEncontradoException e = 
				new ClienteNaoEncontradoException();
			throw e;
		}
	}
	
	

	public int gerarCodigo() throws ConexaoComBancoException, AcessoAoBancoException {		
		return this.clienteDao.gerarCodigo();
	}

	
	
	public void inserir(Cliente novoCliente) throws ClienteJaCadastradoException, ConexaoComBancoException, AcessoAoBancoException {
		if (this.clienteDao.localizar(novoCliente.getCpf(), null) == null){
			this.clienteDao.inserir(novoCliente);
		}else{
			ClienteJaCadastradoException e = 
				new ClienteJaCadastradoException();
			throw e;
		}
	}

	
	
	public List<Cliente> listar() throws ConexaoComBancoException, AcessoAoBancoException, NenhumClienteCadastradoException {
		if(this.clienteDao.listar().size() > 0){
			return this.clienteDao.listar();
		}else{
			NenhumClienteCadastradoException e = 
				new NenhumClienteCadastradoException();
			throw e;
		}
	}
	
	

	public Cliente localizar(String cpf, String rg) throws ConexaoComBancoException, AcessoAoBancoException, ClienteNaoEncontradoException {		
		if(this.clienteDao.localizar(cpf, null) != null){
			return this.clienteDao.localizar(cpf, rg);
		}else{
			ClienteNaoEncontradoException e = 
				new ClienteNaoEncontradoException();
			throw e;
		}
	}
	
	

	public void remover(String cpf) throws ConexaoComBancoException, AcessoAoBancoException, ClienteNaoEncontradoException{
		if(this.clienteDao.localizar(cpf, null) != null){
			this.clienteDao.remover(cpf);
		}else{
			ClienteNaoEncontradoException e = 
				new ClienteNaoEncontradoException();
			throw e;
		}
	}

}
